#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>



int main()
{
    printf("hello printf\n");
    fprintf(stdout, "hello fprintf\n");
    const char *s = "hello puts\n";
    fputs(s, stdout);


    const char* ss = "hello write\n";
    write(1, ss, strlen(ss));

    fork();


    
    return 0;
}









// int main(int argc, char *argv[])
// {
//     if(argc != 2)
//         return 2;
//     // int fd = open("log.txt", O_WRONLY | O_TRUNC | O_CREAT);
//     int fd = open("log.txt", O_WRONLY | O_TRUNC | O_CREAT, 0666);
//     if(fd < 0)
//     {
//         perror("open");
//         return 1;
//     }
// 
//     dup2(fd, 1);
//     fprintf(stdout, "%s\n", argv[1]);
// 
//     close(fd);
//     return 0;
// }





int asdvjmain()
{
    close(0);
    int fd = open("log.txt", O_RDONLY);
    if(fd < 0)
    {
        printf("fd error\n");
        return 1;
    }
    printf("fd: %d\n", fd);
    char buf[64];
    fgets(buf, sizeof buf, stdin);

    printf("buf: %s\n", buf);

    close(fd);




    // close(1);

    // int fd = open("log.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
    // printf("fd: %d\n", fd);
    // printf("fd: %d\n", fd);
    // printf("fd: %d\n", fd);
    // printf("fd: %d\n", fd);

    // close(fd);
    return 0;
}











// // 传递标志位
// #define ONE 0x1
// #define TWO 0x2
// #define THREE 0x4
// void show(int flag)
// {
//   if(flag & ONE)
//     printf("hello one\n");
//   if(flag & TWO)
//     printf("hello two\n");
//   if(flag & THREE)
//     printf("hello three\n");
//   printf("\n");
// }
// int main()
// {
//   show(ONE);
//   show(TWO);
//   show(ONE | TWO);
//   show(ONE | TWO | THREE);
//   return 0;
// }







int main1()
{
  int fd = open("log.txt", O_RDONLY);
  printf("fd: %d\n", fd);
  char buf[32] = "\0";
  read(fd, buf, sizeof buf);
  printf("buf: %s\n", buf);
  close(fd);
  return 0;
}


int madtyjxfgbcxvzin()
{
  const char *s = "vsamnvnzcx\n";
  write(1, s, strlen(s));








  // umask(0);// 进程中的umask码设置为0

  // 相当于C语言中的fopen("log.txt", "w");
  // 相当于C语言中的fopen("log.txt", "a");
  // int fd = open("log.txt", O_WRONLY | O_CREAT | O_APPEND, 0666);// 权限为666, -rw-rw-rw-
  // int fd = open("log.txt", O_RDONLY, 0666);// 权限为666, -rw-rw-rw-
  // if(fd < 0)
  // {
  //   perror("open:");
  //   return 1;
  // }




  // int fd = open("log.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);// 权限为666, -rw-rw-rw-
  // printf("open success, fd: %d\n", fd);
  // 
  // int fd1 = open("log.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);// 权限为666, -rw-rw-rw-
  // printf("open success, fd: %d\n", fd1);
  // 
  // int fd2 = open("log.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);// 权限为666, -rw-rw-rw-
  // printf("open success, fd: %d\n", fd2);
  // 
  // int fd3 = open("log.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);// 权限为666, -rw-rw-rw-
  // printf("open success, fd: %d\n", fd3);
  // // char *buff[64];
  // // memset(buff,'\0', sizeof(buff));
  // // read(fd, buff, sizeof(buff));


  // const char *s1 = "hello write\n";
  // write(fd, s1, strlen(s1));


  // close(fd);
  // close(fd1);
  // close(fd2);
  // close(fd3);
  return 0;
}



















int sadgjin(int argc, char *argv[])
{
  if(argc != 2)
  {
    printf("argc error\n");
    return 1;
  }

  FILE* fp = fopen(argv[1], "r");// append 追加
  if(!fp)
  {
    perror("fopen:");
    return 2;
  }
  else 
  {
    // const char *s1 = "hello fwrite\n";// '\0'是C语言的规定，不是文件的规定
    // fwrite(s1, strlen(s1), 1, fp);// 这里的strlen不要+1，文件中只需要有效数据，'\0'不是有效数据

    // const char *s2 = "hello fprintf\n";
    // fprintf(fp, "%s" ,s2);

    // const char *s3 = "hello fputs\n";
    // fputs(s3, fp);
    
    // 按行读
    char line[64];
    while(fgets(line, sizeof(line), fp) != NULL)
    {
      fprintf(stdout, "%s", line);
    }
  }

  fclose(fp);
  return 0;
}
